/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package db_interaction;

import com.sun.corba.se.impl.protocol.giopmsgheaders.Message;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.Serializable;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 *
 * @author Neves
 */
@Entity
@Table(name = "mensagens")
public class Mensagens implements Serializable {

    @Id
    @GeneratedValue
    private int Mensagens_id;
    @Basic
    @Column(name = "Mensagens_session_Utilizador_id")
    private int Mensagens_session_Utilizador_id;
    @Basic
    @Column(name = "Mensagens_Utilizador_id")
    private int Mensagens_Utilizador_id;
    @Basic
    @Column(name = "Mensagens_descricao")
    private String Mensagens_descricao;
    @Basic
    @Column(name = "Mensagens_activo")
    private boolean Mensagens_activo;

    //GETS
    public int GETMensagens_id() {
        return this.Mensagens_id;
    }

    public int GETMensagens_session_Utilizador_id() {
        return this.Mensagens_session_Utilizador_id;

    }

    public int GETMensagens_Utilizador_id() {
        return this.Mensagens_Utilizador_id;
    }

    public String GETMensagens_descricao() {
        return this.Mensagens_descricao;
    }

    public boolean GETMensagens_activo() {
        return this.Mensagens_activo;
    }

    //SETS
    public void SETMensagens_id(int Mensagens_id) {
        this.Mensagens_id = Mensagens_id;
    }

    public void SETMensagens_session_Utilizador_id(int Mensagens_session_Utilizador_id) {
        this.Mensagens_session_Utilizador_id = Mensagens_session_Utilizador_id;
    }

    public void SETMensagens_Utilizador_id(int Mensagens_Utilizador_id) {
        this.Mensagens_Utilizador_id = Mensagens_Utilizador_id;
    }

    public void SETMensagens_descricao(String Mensagens_descricao) {
        this.Mensagens_descricao = Mensagens_descricao;
    }

    public void SETMensagens_activo(boolean Mensagens_activo) {
        this.Mensagens_activo = Mensagens_activo;
    }

    public int insertEntity(Mensagens me) {
        //returns 1 if successfull
        //return -1 if error
        try {
            Session s = NewHibernateUtil.getSessionFactory();
            s.save(me);
            s.getTransaction().commit();
            System.out.println("Inserido");
            return 1;
        } catch (Exception e) {
            return -1;
        }
    }

    public Mensagens SelectEntity(Mensagens me) {
        Mensagens mens = null;

        //returns sellected friend if successfull
        //return null
        try {
            Session s = NewHibernateUtil.getSessionFactory();
            mens = (Mensagens) s.load(Mensagens.class, me.Mensagens_id);
            s.getTransaction().commit();
            return mens;

        } catch (Exception e) {
            return mens;
        }
    }

    public List SelectMessagens(int id_user) {

        List mens = new ArrayList();

        try {
            Session s = NewHibernateUtil.getSessionFactory();

            s.beginTransaction();

            Query q = s.createSQLQuery("Select DISTINCT Mensagens_session_Utilizador_id, Mensagens_Utilizador_id, Mensagens_descricao, Mensagens_activo from Mensagens where Mensagens_session_Utilizador_id = " + id_user + " group by Mensagens_session_Utilizador_id, Mensagens_Utilizador_id");
            mens = q.list();

            s.getTransaction().commit();

            return mens;

        } catch (Exception e) {
            return mens;
        }
    }

    public int AddMessage(int Mensagens_session_Utilizador_id, int Mensagens_Utilizador_id, String Mensagem_descricao) {

        Mensagens add_message = new Mensagens();
        int id_inserted_message;
        try {
            Session s = NewHibernateUtil.getSessionFactory();

            s.beginTransaction();

            add_message.SETMensagens_session_Utilizador_id(Mensagens_session_Utilizador_id);
            add_message.SETMensagens_Utilizador_id(Mensagens_Utilizador_id);
            add_message.SETMensagens_descricao(Mensagem_descricao);
            add_message.SETMensagens_activo(true);
            s.save(add_message);
            s.flush();
            id_inserted_message = add_message.GETMensagens_id();

            s.getTransaction().commit();

            return id_inserted_message;

        } catch (Exception e) {
            return 0;
        }
    }

    public Boolean CreateMessage(int Mensagens_session_Utilizador_id, int Mensagens_Utilizador_id, String Mensagem_descricao) {

        Mensagens add_message = new Mensagens();
        Mensagens add_message2 = new Mensagens();

        try {
            Session s = NewHibernateUtil.getSessionFactory();

            s.beginTransaction();

            add_message.SETMensagens_session_Utilizador_id(Mensagens_session_Utilizador_id);
            add_message.SETMensagens_Utilizador_id(Mensagens_Utilizador_id);
            add_message.SETMensagens_descricao(Mensagem_descricao);
            add_message.SETMensagens_activo(true);
            s.save(add_message);

            s.getTransaction().commit();

            s.beginTransaction();

            add_message2.SETMensagens_session_Utilizador_id(Mensagens_Utilizador_id);
            add_message2.SETMensagens_Utilizador_id(Mensagens_session_Utilizador_id);
            add_message2.SETMensagens_descricao(Mensagem_descricao);
            add_message2.SETMensagens_activo(true);
            s.save(add_message2);

            s.getTransaction().commit();

            return true;

        } catch (Exception e) {
            return false;
        }
    }

    public List<Mensagens> SelectAllmessagesUser(int Mensagens_session_Utilizador_id, int Mensagens_Utilizador_id) {

        List<Mensagens> mensagens_session_user_amigo = null;
        List<Mensagens> mensagens_amigo_session_user = null;
        List<Mensagens> lista_total_mensagens = new ArrayList();
        int aux_tam;
        try {
            Session s = NewHibernateUtil.getSessionFactory();

            s.beginTransaction();
            Query q = s.createQuery("from Mensagens where Mensagens_session_Utilizador_id = " + Mensagens_session_Utilizador_id + " AND Mensagens_Utilizador_id = " + Mensagens_Utilizador_id);
            mensagens_session_user_amigo = q.list();
            s.getTransaction().commit();

            s.beginTransaction();
            Query q2 = s.createQuery("from Mensagens where Mensagens_session_Utilizador_id = " + Mensagens_Utilizador_id + " AND Mensagens_Utilizador_id = " + Mensagens_session_Utilizador_id);
            mensagens_amigo_session_user = q2.list();
            s.getTransaction().commit();

            aux_tam = mensagens_session_user_amigo.size();
            if (aux_tam < mensagens_amigo_session_user.size()) {
                aux_tam = mensagens_amigo_session_user.size();
            }

            for (int i = 0; i < aux_tam; i++) {
                if (i < mensagens_session_user_amigo.size()) {
                    lista_total_mensagens.add(mensagens_session_user_amigo.get(i));
                }
                if (i < mensagens_amigo_session_user.size()) {
                    lista_total_mensagens.add(mensagens_amigo_session_user.get(i));
                }
            }

            return lista_total_mensagens;

        } catch (Exception e) {
            return null;
        }
    }

    public int UpdateEntity(Mensagens me) {
        //returns 1 if successfull
        //return -1 if error
        try {
            Session s = NewHibernateUtil.getSessionFactory();
            s.save(me);
            s.getTransaction().commit();
            return 1;

        } catch (Exception e) {
            return -1;
        }
    }

    public Utilizador SelectNewMessages(int id_mensagens) {

        Mensagens men = new Mensagens();
        Utilizador ut = new Utilizador();
        try {
            Session s = NewHibernateUtil.getSessionFactory();

            s.beginTransaction();
            Query q3 = s.createQuery("from Mensagens where Mensagens_id = " + id_mensagens);
            men = (Mensagens) q3.list().get(0);
            s.getTransaction().commit();


            s.beginTransaction();
            Query q4 = s.createQuery("from Utilizador where Utilizador_id = " + men.GETMensagens_session_Utilizador_id());
            ut = (Utilizador) q4.list().get(0);
            s.getTransaction().commit();

            return ut;

        } catch (Exception e) {
            return null;
        }
    }

    public Boolean ChangeMensageNotification(int Mensagens_Utilizador_id, int Mensagens_Utilizador_id_amigo) {

        List<Mensagens> men = null;
        List<Notificacao> not_teste = null;
        Mensagens last_message_user = new Mensagens();
        Utilizador ut = new Utilizador();
        int id_mensagem;
        try {
            Session s = NewHibernateUtil.getSessionFactory();

            s.beginTransaction();
            Query q3 = s.createQuery("from Mensagens where Mensagens_session_Utilizador_id = " + Mensagens_Utilizador_id + " and Mensagens_Utilizador_id = " + Mensagens_Utilizador_id_amigo);
            men = q3.list();
            s.getTransaction().commit();

            for (int i = 0; i < men.size(); i++) {
                last_message_user = men.get(i);
            }

            id_mensagem = last_message_user.GETMensagens_id();


            s.beginTransaction();
            Query q1 = s.createQuery("from Notificacao where Notificacoes_Utilizador_id = " + Mensagens_Utilizador_id_amigo + " and Notificacoes_mensagens_id = " + id_mensagem);
            not_teste = q1.list();
            s.getTransaction().commit();

            // Actualizar tabela de notificações para desactivar a notificacao
            s.beginTransaction();
            Query q6 = s.createQuery("update from Notificacao set Notificacoes_activo = 0 where Notificacoes_id = " + not_teste.get(0).GETNotificacoes_id());
            q6.executeUpdate();
            s.getTransaction().commit();

            return true;

        } catch (Exception e) {
            return false;
        }
    }

    public Utilizador SelectNewMessagesAmotherUser(int id_mensagens) {

        Mensagens men = new Mensagens();
        Utilizador ut = new Utilizador();
        try {
            Session s = NewHibernateUtil.getSessionFactory();

            s.beginTransaction();
            Query q3 = s.createQuery("from Mensagens where Mensagens_id = " + id_mensagens);
            men = (Mensagens) q3.list().get(0);
            s.getTransaction().commit();


            s.beginTransaction();
            Query q4 = s.createQuery("from Utilizador where Utilizador_id = " + men.GETMensagens_Utilizador_id());
            ut = (Utilizador) q4.list().get(0);
            s.getTransaction().commit();

            return ut;

        } catch (Exception e) {
            return null;
        }
    }
}
